package com.linked.mystyle.util;

import com.alibaba.nacos.api.utils.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author :dbq
 * @date : 2022/9/30 15:25
 */
public class LinkedDateTime {
    /**
     * 日期时间 格式化的格式
     */
    private static final String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    private static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd";

    /**
     * 返回当前日期
     *
     * @return
     */
    public static LocalDate getCurrentDate() {
        return LocalDate.now();
    }

    /**
     * 获取当前日期时间
     *
     * @return
     */
    public static LocalDateTime getCurrentDateTime() {
        return LocalDateTime.now();
    }

    /**
     * 格式化当前日期为字符串
     *
     * @param pattern 格式化格式
     * @return
     */
    public static String parseCurrentDateTime(String pattern) {
        if (StringUtils.isBlank(pattern)) {
            return "";
        }
        return getCurrentDateTime().format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 根据指定的格式化格式，对给定的日期进行格式化
     *
     * @param dateTimeStr 待格式化日期
     * @param pattern     格式化的格式
     * @return
     */
    public static String parseDateTime(String dateTimeStr, String pattern) {
        if (StringUtils.isBlank(dateTimeStr) || StringUtils.isBlank(pattern)) {
            return "";
        }
        return parseLocalDateTime(dateTimeStr, pattern).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期格式
     *
     * @param dateStr 待格式化的日期字符串
     * @param pattern 格式化的格式
     * @return
     */
    public static LocalDate parseLocalDate(String dateStr, String pattern) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期时间格式
     *
     * @param dateTimeStr 待格式化的日期时间字符串
     * @param pattern     格式化的格式
     * @return
     */
    public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) {
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取指定时间加上几个小时之后的时间
     *
     * @param dateTimeStr 给定时间，为空的情况下，已当前时间做为相加基础
     * @param plusHour    要加的小时数
     * @param pattern     返回时间的格式化的格式
     * @return
     */
    public static String getPlusHourDateTime(String dateTimeStr, String plusHour, String pattern) {
        LocalDateTime dateTime = null;
        if (StringUtils.isBlank(dateTimeStr)) {
            dateTime = getCurrentDateTime();
        } else {
            dateTime = parseLocalDateTime(dateTimeStr, DATE_TIME_FORMAT_PATTERN);
        }
        if (StringUtils.isBlank(plusHour)) {
            return "";
        }
        if (StringUtils.isBlank(pattern)) {
            pattern = DATE_TIME_FORMAT_PATTERN;
        }
        return dateTime.plusHours(Long.valueOf(plusHour)).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 获取指定时间加上几个小时之后的时间
     *
     * @param dateTimeStr 给定时间，为空的情况下，已当前时间做为相加基础
     * @param plusHour    要加的小时数
     * @return
     */
    public static String getPlusHourDateTime(String dateTimeStr, String plusHour) {
        return getPlusHourDateTime(dateTimeStr, plusHour, null);
    }

    /**
     * 获取指定时间加上几个小时之后的时间
     *
     * @param plusHour 要加的小时数
     * @return
     */
    public static String getPlusHourDateTime(String plusHour) {
        return getPlusHourDateTime(null, plusHour, null);
    }

    /**
     * 比较两个给定时间的大小
     *
     * @param beforeDateTimeStr 给定时间
     * @param afterDateTimeStr  给定时间
     * @return beforeDateTimeStr 小于 afterDateTimeStr 返回true; beforeDateTimeStr 大于 afterDateTimeStr 返回false;
     */
    public static Boolean compareDateTime(String beforeDateTimeStr, String afterDateTimeStr) {
        if (StringUtils.isBlank(beforeDateTimeStr) || StringUtils.isBlank(afterDateTimeStr)) {
            return false;
        }
        LocalDateTime beforeDateTime = parseLocalDateTime(beforeDateTimeStr, DATE_TIME_FORMAT_PATTERN);
        LocalDateTime afterDateTime = parseLocalDateTime(afterDateTimeStr, DATE_TIME_FORMAT_PATTERN);
        return beforeDateTime.isBefore(afterDateTime);
    }

    /**
     * 比较两个日期的大小
     *
     * @param beforeDateStr 给定的时间
     * @param afterDateStr  给定的时间
     * @return beforeDateStr 小于 afterDateStr 返回true; beforeDateStr 大于 afterDateStr 返回false;
     */
    public static Boolean compareDate(String beforeDateStr, String afterDateStr) {
        if (StringUtils.isBlank(beforeDateStr) || StringUtils.isBlank(afterDateStr)) {
            return false;
        }
        LocalDate beforeDate = parseLocalDate(beforeDateStr, DATE_FORMAT_PATTERN);
        LocalDate afterDate = parseLocalDate(afterDateStr, DATE_FORMAT_PATTERN);
        return beforeDate.isBefore(afterDate) || beforeDate.isEqual(afterDate);
    }

    /**
     * 比较给定时间同当前日期的大小关系
     *
     * @param dateTimeStr 指定的日期
     * @return 指定时间比当前时间 小 返回true；比当前时间大，返回false
     */
    public static Boolean compareDateTime(String dateTimeStr) {
        if (StringUtils.isBlank(dateTimeStr)) {
            return false;
        }
        LocalDateTime dateTime = parseLocalDateTime(dateTimeStr, DATE_TIME_FORMAT_PATTERN);
        return dateTime.isBefore(getCurrentDateTime());
    }

    /**
     * 计算两个日期的天数
     *
     * @param beforeDateTimeStr 开始日期
     * @param afterDateTimeStr  结束日期
     * @return 结果信息
     */
    public static int dateDiff(String beforeDateTimeStr, String afterDateTimeStr) {
        LocalDateTime beforeDateTime = parseLocalDateTime(beforeDateTimeStr, DATE_TIME_FORMAT_PATTERN);
        LocalDateTime afterDateTime = parseLocalDateTime(afterDateTimeStr, DATE_TIME_FORMAT_PATTERN);
//获取第一个时间点的时间戳对应的秒数
        long t1 = beforeDateTime.toEpochSecond(ZoneOffset.ofHours(0));
//获取第一个时间点在是1970年1月1日后的第几天
        long day1 = t1 / (60 * 60 * 24);
//获取第二个时间点的时间戳对应的秒数
        long t2 = afterDateTime.toEpochSecond(ZoneOffset.ofHours(0));
//获取第二个时间点在是1970年1月1日后的第几天
        long day2 = t2 / (60 * 60 * 24);
//返回两个时间点的天数差
        return (int) (day2 - day1);
    }

    /**
     * 获取当前天数加几天的日期
     *
     * @param dateStr 当前天数
     * @param addDay  添加日期
     * @return 返回信息
     */
    public static String dateTimeAdd(String dateStr, String addDay) {
        LocalDateTime beforeDateTime = parseLocalDateTime(dateStr, DATE_TIME_FORMAT_PATTERN);
        LocalDateTime localDate = beforeDateTime.plusDays(Long.valueOf(addDay));
        return localDate.format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT_PATTERN));
    }
}
